Печать

DirectX 8 Graphics. Вьюпорты (Viewports)


В игре вьюпорты выглядят как минимониторы, отображающие сцену с другого ракурса (= виртуальной камеры).1 Самый простой пример вьюпорта - зеркало заднего вида (в салоне или на дверях) автомобиля в гоночном симуляторе/аркаде. Основной вьюпорт, как правило, развёрнут на весь экран. Поддержка вьюпортов позволяет моментально изменять размеры "обзора" текущей камеры.



Вьюпорты в DirectX 8 (Win32)

Для создания вьюпорта сперва заполняем структуру D3DVIEWPORT8, прописывая в ней координаты и размеры нового вьюпорта. Вот её шаблон:
typedef struct _D3DVIEWPORT8 {
	DWORD X; // Крайняя левая X-координата вьюпорта.
	DWORD Y; // Крайняя верхняя Y-координата вьюпорта.
	DWORD Width; // Ширина вьюпорта.
	DWORD Height; // Высота вьюпорта.
	float MinZ; // 0.0
	float MaxZ; // 1.0
	}D3DVIEWPORT8;

Сразу после заполнения, командуем Direct3D использовать новый вьюпорт в качестве текущего:
...
// pD3DDevice - предварительно созданный и проинициализированный объект устройства Direct3D.
// Создаём вьюпорт.
D3DVIEWPORT8 d3dvp = {0.0, 100, 100, 0.0f, 1.0f};

// Назначаем новый вьюпорт объекту устройства Direct3D.
pD3DDevice->SetViewport(&d3dvp);
...

С этого момента (после вызова функции ID3DDevice8::SetViewport) вся графика данного объекта устройства будет рендериться только в этот вьюпорт.
После назначения нового вьюпорта, необходимо восстановить старый. Для получения настроек старого вьюпорта и их последующего восстановления вызываем функцию ID3DDevice8::GetViewport:
...
// pD3DDevice - предварительно созданный и проинициализированный объект устройства Direct3D.
D3DVIEWPORT8 OldViewport;

// Получаем настройки старого (old) вьюпорта.
pD3DDevice->GetDevice(&OldViewport);

// Сменяем настройки вьюпорта (при необходимости).
// Восстанавливаем старый вьюпорт.
pD3DDevice->SetDevice(&OldViewport);
...


Источники


1. Adams J. Programming Role Playing Games with DirectX 8.0. - Premier Press. 2002



Последние изменения страницы Пятница 13 / Май, 2022 12:08:59 MSK

Последние комментарии wiki

No records to display

Search Wiki Page

Точное совпадение

Категории

|--> C#
|--> C++